perm filename KWIC.PRG[T,LSP]1 blob
sn#627071 filedate 1981-11-30 generic text, type T, neo UTF8
KWIC: PROCEDURE OPTIONS (MAIN);
/*A PROGRAM TO FORMAT A KWIC INDEX*/
DECLARE
DIR(10) FIXED (3,0),/*DIRECTORY ARRAY*/
I FIXED (2,0),/*COUNTER*/
BIB CHAR (134) VARYING,/*BIBLIOGRAPHICAL MATERIAL*/
TRUE BIT (1),/*SWITCH TRANSLATION*/
FALSE BIT (1),/*SWITCH TRANSLATION*/
OKOK BIT (1),/*END FLAG*/
KEYWORDS(500,2) CHAR(50) VARYING,/*KWIC ELEMENTS*/
FILL FIXED (3,0),/*COUNTER FOR ARRAY*/
STOPWORDS(7) CHAR(10) INIT ('A','AN','AND','FOR',
'OF','THE','TO'),/*NON INDEXED TERMS*/
STOPWORDLENGTH FIXED BIN(32);/*SIZE OF STOPWD ARRAY*/
/*INITIALIZE VARIABLES*/
I = 0;
DIR = 0;
BIB←PART = 0;
OKOK = '1'B;
TRUE = '1'B;
FALSE = '0'B;
DIR(10) = 0;
FILL = 1;
STOPWORDLENGTH = 7;
ON ENDFILE (SYSIN) OKOK = FALSE;
GET EDIT ((DIR (I) DO I = 1 TO 9),BIB)
(9 F(3,0),A(133));
MRCTIME:/*GRAB TITLE & LCCN OUT OF BIB MATERIAL*/
DO WHILE (OKOK);
USEDIR
CALL SEPARATE (SUBSTR(BIB,DIR(3),DIR(4)-DIR(3)),
SUBSTR(BIB,DIR(7),DIR(8)-DIR(7)));
GET EDIT ((DIR (I) DO I = 1 TO 9),BIB)
(9 F(3,0),A(133));
END USEDIR;
CALL SORT(KEYWORDS,FILL-1);
CALL PRINT←IT(KEYWORDS,FILL-1);
END MRCTIME;
/*DIVIDE TITLES INTO KEYWORDS & STICK IN AN ARRAY WITH LCCN*/
SEPARATE: PROCEDURE (TITLE,LCCN);
DECLARE
TITLE CHAR(50) VARYING,
LCCN CHAR(12) VARYING,
POSITION FIXED (3,0),
WORD CHAR(20) VARYING,
POSITION = INDEX(TITLE,` ');
SAMURAI: DO WHILE (POSITION ¬= 0);/*CHOP UP TITLE*/
WORD = SUBSTR(TITLE,1,POSITION - 1);
/*SCAN FOR STOPWORDS*/
CALL MEMBER (WORD,STOPWORDS,STOPWORDLENGTH,RESULT);
IF (RESULT = FALSE) THEN /*FILL ARRAY ACCEPTABLE WDS*/
DO;
KEYWORDS(FILL,1) = WORD;
KEYWORDS(FILL,2) = LCCN;
FILL = FILL + 1;
END;
TITLE = SUBSTR(TITLE,POSITION + 1);
POSITION = INDEX(TITLE,` ');
END SAMURAI;
END SEPARATE;
MEMBER: PROCEDURE (ITEM,SET,N,RESULT);
DECLARE
SET(*) CHAR (50) VARYING,
N FIXED BINARY (32), /*NO. OF STOPWORDS IN ARRAY*/
I FIXED BINARY (32),/*ARRAY COUNTER*/
DONE BIT (1),/*SWITCH*/
RESULT BIT (1),
ITEM CHAR (50) VARYING;
/*INITIALIZE VARIABLES*/
RESULT = FALSE;
DONE = FALSE;
I = 1;
TEST: DO WHILE ((I <= N) | DONE);
IF (ITEM = SET(I)) THEN DO; DONE = TRUE;
RESULT = TRUE;
END;
I = I + 1;
END TEST;
END MEMBER;
SORT: PROCEDURE (ARRAY,LOC);
DECLARE
ARRAY(*,2) CHAR(50) VARYING,/*KEYWDS & LCCNS*/
TEMP CHAR(50) VARYING,/*FOR SHUFFLING AROUND ARRAY ITEMS*/
LOC FIXED BIN(32),/*POINTER TO ARRAY*
PASS FIXED BIN(32),/*LOOKING OVER ARRAY*/
J FIXED BIN(32),/*COUNTER*/
GO BIT(1);/*SWITCH*/
GO = TRUE;
OUT←OF←SORTS: DO PASS = 1 TO LOC - 1
WHILE (GO);
GO = FALSE;
EACH←PASS: DO J = 1 TO LOC - PASS;
IF ARRAY(J,1) > ARRAY(J + 1,1) THEN
DO;
GO = TRUE;
TEMP = ARRAY(J,1);
ARRAY(J,1) = ARRAY(J + 1,1);
ARRAY(J + 1,1) = TEMP;
TEMP = ARRAY(J,2);
ARRAY(J,2) = ARRAY(J + 1,2);
ARRAY(J + 1,2) = TEMP;
END;
END EACH←PASS;
END OUT←OF←SORTS;
END SORT;
PRINT←IT: PROCEDURE(WORDS,FINDEM)
DECLARE
WORDS(*,2) CHAR(50) VARYING,
FINDEM FIXED BIN(32);
FINDEM = 1;
PUT SKIP LIST
(WORDS(FINDEM,1));
PUT SKIP LIST
(' '||WORDS(FINDEM,2));
LIST: DO I = 1 TO FINDEM;
IF WORDS(FINDEM,1) ¬= WORDS((FINDEM + 1),1) THEN
DO;
PUT SKIP(2) LIST (WORDS(FINDEM,1));
PUT SKIP LIST (' '||WORDS(FINDEM,2);
END;
ELSE PUT SKIP LIST (' '||WORDS(FINDEM,2);
FINDEM = FINDEM + 1;
END LIST;
END PRINT←IT;
END KWIC;